const passport = require('passport');
const jwt = require('jsonwebtoken');
const User = require('../models/User.js');

// 设置 token 的过期时间为 7 天
const TOKEN_EXPIRATION_TIME = '7d';

// 存储 token 黑名单
const tokenBlacklist = new Set();

/**
 *@desc 登录方法
 */
exports.createLogin = (req, res, next) => {
  passport.authenticate('local', (err, user, info) => {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.status(401).json({message: info.message});
    }

    // 使用随机字符串作为密钥生成 token
    const token = jwt.sign({id: user.id, role: user.role}, process.env.SECRET_KEY, {
      expiresIn: TOKEN_EXPIRATION_TIME
    });
    res.json({message: 'Login successful', token, userId: user.id});
  })(req, res, next);
};
/**
 * @desc 刷新 token
 */
exports.refreshToken = (req, res) => {
  const currentUserId = req.user.id;
  const userId = req.body.userId;

  if (currentUserId !== userId) {
    return res.status(401).json({message: 'Unauthorized'});
  }
  // 获取原 token
  let token = req.headers.authorization;
  if (typeof token === 'string' && /^Bearer /gi.test(token)) {
    token = token.split(' ')[1];
  }
  // 校验 token
  jwt.verify(token, process.env.SECRET_KEY, (err, decoded) => {
    if (err) {
      return res.status(401).json({message: 'Invalid token.'});
    }
    // 如果 token 已经过期，则无法刷新
    if (decoded.exp <= Date.now() / 1000) {
      return res.status(401).json({message: 'Token has expired.'});
    }

    // 使用原 token 中的 userId 和新的签名生成新的 token
    const payload = {id: decoded.id, role: decoded.role};
    const refreshedToken = jwt.sign(payload, process.env.SECRET_KEY, {
      expiresIn: TOKEN_EXPIRATION_TIME
    });

    // 将新的 token 返回给客户端
    res.json({message: 'Token refreshed.', token: refreshedToken});
  });
};
/*
 *@desc 登出
 */
exports.logout = (req, res) => {
  const currentUserId = req.user.id;
  const userId = req.body.userId;

  if (currentUserId !== userId) {
    return res.status(401).json({message: 'Unauthorized'});
  }

  // 获取原 token
  let token = req.headers.authorization;
  if (typeof token === 'string' && /^Bearer /gi.test(token)) {
    token = token.split(' ')[1];
  }

  // 将 token 加入黑名单
  tokenBlacklist.add(token);

  res.json({message: 'Logged out.'});
};

/**
 *  @desc 验证 token
 */
exports.verifyToken = (req, res, next) => {
  // 获取 token
  let token = req.headers.authorization;
  if (typeof token === 'string' && /^Bearer /gi.test(token)) {
    token = token.split(' ')[1];
  }
  // 检查 token 是否在黑名单中
  if (tokenBlacklist.has(token)) {
    return res.status(401).json({message: 'Token has been invalidated.'});
  }

  // 校验 token
  jwt.verify(token, process.env.SECRET_KEY, (err, decoded) => {
    if (err) {
      return res.status(401).json({message: 'Unauthorized'});
    }

    // 将用户 ID 加入到 req 对象中
    req.user = {
      id: decoded.id,
      role: decoded.role
    };
    next();
  });
};

exports.authorize = (roles = []) => {
  if (roles && typeof roles === 'string') {
    roles = [roles];
  }

  return [
    async (req, res, next) => {
      User.findById(req.user.id, (err, user) => {
        if (err) {
          return res.status(500).json({message: err.message});
        }
        if (!user) {
          return res.status(404).json({message: 'User not found'});
        }
        if (roles.length && !roles.includes(user.role)) {
          return res.status(401).json({message: 'Unauthorized'});
        }
        next();
      });
    }
  ];
};
